﻿using System;
using System.Collections.Generic;
using System.Text;

namespace iri10
{
    class NegComputadora
    {
        private static Notebook[] lstNotebooks;
        private static Desktop[] lstDesktops;

        public static Boolean inicializar()
        {
            //TODO: cargar bases desde la base de datos
            lstNotebooks = getNotebooks();
            lstDesktops = getDesktops();
            return true;
        }

        public static Computadora getComputadora(uint id)
        {
            int iCont = 0;
            uint identificador = 0;

            //mal
            if (id == 0)
                return null;

            //Busco en las desktop
            if (lstDesktops != null)
                while (identificador != id && iCont <= lstDesktops.GetUpperBound(0))
                {
                    identificador = lstDesktops[iCont++].ID;
                }

            //era desktop
            if (identificador == id)
                return (Computadora)lstDesktops[--iCont];

            //reiniciamos el contador
            iCont = 0;

            //Busco en las notebooks
            while (identificador != id && iCont <= lstNotebooks.GetUpperBound(0))
            {
                identificador = lstNotebooks[iCont++].ID;
            }

            //era notebook TODO revisar el --
            if (identificador == id)
                return (Computadora)lstNotebooks[--iCont];


            return null;
        }

        private static Notebook[] getNotebooks()
        {
            String sConsulta = "SELECT * FROM computadora c WHERE tipo = 'Notebook' AND base <> 0;";

            //Busco las pcs de la bd
            Object[] res = BaseDatos.Consultar(sConsulta);

            //Armo el array
            Notebook[] lstNtbs = new Notebook[res.GetUpperBound(0) + 1];

            //
            for (int iCont = 0; iCont <= res.GetUpperBound(0); iCont++)
            {
                //Cargo los datos de la computadora
                Notebook pc = (Notebook)Notebook.getComputadora((Object[])(res[iCont]));
                lstNtbs[iCont] = pc;
            }

            return lstNtbs;

        }

        private static Desktop[] getDesktops()
        {
            String sConsulta = "SELECT * FROM computadora c WHERE tipo = 'Desktop' AND base <> 0;";

            //Busco las pcs de la bd
            Object[] res = BaseDatos.Consultar(sConsulta);

            //Armo el array
            Desktop[] lstDsk = new Desktop[res.GetUpperBound(0) + 1];

            //
            for (int iCont = 0; iCont <= res.GetUpperBound(0); iCont++)
            {
                //Cargo los datos de la computadora
                Desktop pc = (Desktop)Desktop.getComputadora((Object[])(res[iCont]));
                lstDsk[iCont] = pc;
            }

            return lstDsk;

        }

        public static uint almacenarComputadora(Computadora c)
        {
            String sConsulta = "INSERT INTO Computadora(modelo,base,tipo,precio) VALUES ('" +
                c.SModelo + "'," +
                c.PcBase.ID.ToString() + ",'" + 
                ((c is Notebook)?"Notebook":"Desktop") + "'," +
                c.FPrecio + ");";

            
            //Guardo en la BD la computadora
            BaseDatos.ConsultarSimple(sConsulta);

            //Busco el id
            String sConsulta2 = "SELECT MAX(id) FROM `computadora`;";

            c.ID = (uint)BaseDatos.ConsultarSimple(sConsulta2);


            //Almaceno los componentes obligatorios
            foreach(Componente cp in c.CompObligatorios)
            {
                sConsulta = "INSERT INTO pccomponente(idComputadora,idComponente,tipo) VALUES (" +
                    c.ID + "," +
                    cp.Id + "," +
                    "'Obligatorio');";
                BaseDatos.ConsultarSimple(sConsulta);
            }

            //Almaceno los componentes Modificables
            foreach (Componente cp in c.CompModificable)
            {
                sConsulta = "INSERT INTO pccomponente(idComputadora,idComponente,tipo) VALUES (" +
                    c.ID + "," +
                    cp.Id + "," +
                    "'Modificable');";
                BaseDatos.ConsultarSimple(sConsulta);
            }
            //Almaceno los componentes obligatorios
            foreach (Componente cp in c.CompEliminable)
            {
                sConsulta = "INSERT INTO pccomponente(idComputadora,idComponente,tipo) VALUES (" +
                    c.ID + "," +
                    cp.Id + "," +
                    "'Eliminable');";
                BaseDatos.ConsultarSimple(sConsulta);
            }

            inicializar();
            return c.ID;
        }
    }
}
